home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / netprog.zip / NETPROG.TAR / lock / mandatory.c < prev    next >
C/C++ Source or Header  |  1989-12-17  |  1KB  |  53 lines

  1. /*
  2.  * Test the System V Release 3 advisory versus mandatory lock.
  3.  */
  4.  
  5. #include    <unistd.h>
  6. #include    <fcntl.h>
  7. #include    <sys/errno.h>
  8. extern int    errno;
  9.  
  10. #define    TEMPFILE    "temp.foo"
  11.  
  12. main()
  13. {
  14.     int    fd, pid;
  15.     char    buff[5];
  16.  
  17.     if ( (pid = fork()) < 0) {
  18.         err_sys("fork error");
  19.  
  20.     } else if (pid > 0) {            /* parent */
  21.         if ( (fd = open(TEMPFILE, 2)) < 0)
  22.             err_sys("parent: open error");
  23.         if (lockf(fd, F_TLOCK, 0L) < 0)
  24.             err_sys("parent: F_TLOCK error");
  25.  
  26.         while (wait((int *) 0) != pid)
  27.             ;
  28.  
  29.         close(fd);
  30.         exit(0);
  31.  
  32.     } else {            /* child */
  33.         sleep(1);
  34.         if ( (fd = open(TEMPFILE, 0)) < 0)
  35.             err_sys("child: open error");
  36.         if (fcntl(fd, F_SETFL, O_NDELAY) < 0)
  37.             err_sys("child: fcntl error");
  38.  
  39.         if (lockf(fd, F_TEST, 0L) == 0)
  40.             err_sys("child: F_TEST succeeded");
  41.         if ((errno != EACCES) && (errno != EAGAIN))
  42.             err_sys("child: bad errno after F_TEST");
  43.  
  44.         if (read(fd, buff, 5) < 0)
  45.             printf("child: read failed, errno = %d\n", errno);
  46.         else
  47.             printf("child: read OK, buff = %5.5s\n", buff);
  48.  
  49.         close(fd);
  50.         exit(0);
  51.     }
  52. }
  53.